Skip to main content

CNC 示例 17:从字符串中读取 G 代码

参见 CNC17_ReadGCodeFromStrings.project CODESYS 安装目录下的示例项目 ..\CODESYS SoftMotion\Examples

该示例项目展示了如何使用 smc_stringStream2 从字符串中读取 G 代码。

这个例子可以看作是一个起点,用于从其他来源读取 G 代码,例如通过网络通信(套接字)。在这种情况下,需要实现一个功能块来实现 SMC_ITextStream 接口并读取文本(例如,从套接字读取)。这与方法类似 SMC_StringStream2 实现此接口以从字符串中读取 G 代码。

应用程序的结构

该结构是数控应用的典型结构。G 代码在后台任务中读取PathTask),路径预处理也在这里进行。插值是在总线任务中执行的

Path 程序, SMC_ReadNCFromStream 功能块用于读取 G 代码。出于技术原因,不仅仅是类型的直播 SMC_StringStream2 被传递给这个函数块,但也传递给一个大小取决于参数的数组 SMC_CNC_LibParams.MAX_SUBPROGRAM_NESTING_DEPTH。数组中的第一个流用于主程序,而其他流用于可能的子程序调用

一开始,主程序被加载到数组的第一个流中:

// Load G-Code into first stream
aStringStream[0].Init(sProgramName) ;
aStringStream[0].AppendData(sGCode) ;
aStringStream[0].SetEndOfData() ;

然后,一切准备就绪,可以读取常用的 G 代码程序。该示例还显示了如何支持子程序调用。

为此,必须创建一个函数块来实现 SMC_INCLookup 接口。此功能块负责在读取子程序时返回子程序的 G 代码 SMC_ReadNCFromStream。这个 Lookup 方法接收子程序的名称并使用 G 代码初始化传入流:

METHOD LookUp : SMC_ERROR
VAR_IN_OUT CONSTANT
    programName : STRING;
END_VAR
VAR_INPUT
    stream : SMC_ITextStream;
END_VAR
VAR
    i : UDINT ;
    pStringStream : POINTER TO SMC_StringStream2 ;
END_VAR

此示例搜索子程序数组。该数组定义在 Path 编程为 VAR_INPUT:

   // The table of subprograms.
   aSubs : ARRAY[0..0] OF SubProgram := [
            (stName := 'SUB1',
             stContent := '
SUBPROGRAM SUB1{#p1 : LREAL, #p2 : LREAL, #p3 : LREAL}
N10 G1 X#p1
N20 G1 X#p2
N30 G1 X#p3
END_SUBPROGRAM')
        ] ;

Lookup,对数组进行迭代,直到找到名称匹配的子程序:

i := 0 ;
WHILE i < nNumSPs DO
    IF psp[i].stName = programName THEN
        IF NOT __QUERYPOINTER(stream, pStringStream) OR_ELSE
           pStringStream = 0
        THEN
            // A stream of the wrong type has been passed by SMC_ReadNCFromStream.
            LookUp := SMC_CNC_INTERNAL_ERROR ;
        ELSE
            pStringStream^.Init(sName := psp[i].stName) ;
            LookUp := pStringStream^.AppendData(psp[i].stContent) ;
            pStringStream^.SetEndOfData() ;
        END_IF
        RETURN ;
    END_IF

    i := i + 1 ;
END_WHILE
 
// No subprogram with name programName has been found in the array psp.
LookUp := SMC_RNCF_SUBPROGRAM_FILE_NOT_FOUND ;

调试

  1. 生成应用程序并将其下载到控制器。

  2. 打开可视化。

  3. 开始 开始 G 代码处理。